package main

import (
	"fmt"
	"reflect"
)

type User03 struct {
	Id   int
	Name string
	Age  int
}

func main() {
	checkType("s")
	checkKind(User03{})
}

// 此方法的劣势为无法穷举自定义类型，所以可能出现漏判的情况，推荐使用类型分类进行判断
func checkType(val interface{}) {
	//val.(type)只可以在switch语句中使用
	switch val.(type) {
	case int:
		fmt.Println("int")
	case string:
		fmt.Println("string")
	case bool:
		fmt.Println("bool")
	case User03:
		fmt.Println("User03")
	default:
		fmt.Println("未知类型")
	}
}

// 在分类中，所有的自定义结构体都归属结构体分类
func checkKind(val interface{}) {
	kind := reflect.TypeOf(val).Kind()
	switch kind {
	case reflect.Int:
		fmt.Println("int")
	case reflect.String:
		fmt.Println("string")
	case reflect.Bool:
		fmt.Println("bool")
	case reflect.Struct:
		fmt.Println("struct")
	default:
		panic("unhandled default case")
	}
}
